package com.ruoyi.system.mapper;

import java.util.List;
import java.math.BigDecimal;
import java.util.Date;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.system.domain.BizPurchaseOrder;
import com.ruoyi.system.domain.BizPurchaseOrderItem;
import com.ruoyi.system.domain.BizPurchaseOrderItemView;

/**
 * 采购订单Mapper接口
 * 
 * @author ruoyi
 * @date 2025-10-20
 */
public interface BizPurchaseOrderMapper 
{
    /**
     * 查询采购订单
     * 
     * @param orderId 采购订单主键
     * @return 采购订单
     */
    public BizPurchaseOrder selectBizPurchaseOrderByOrderId(Long orderId);

    /**
     * 查询采购订单列表
     * 
     * @param bizPurchaseOrder 采购订单
     * @return 采购订单集合
     */
    public List<BizPurchaseOrder> selectBizPurchaseOrderList(BizPurchaseOrder bizPurchaseOrder);

    /**
     * 新增采购订单
     * 
     * @param bizPurchaseOrder 采购订单
     * @return 结果
     */
    public int insertBizPurchaseOrder(BizPurchaseOrder bizPurchaseOrder);

    /**
     * 修改采购订单
     * 
     * @param bizPurchaseOrder 采购订单
     * @return 结果
     */
    public int updateBizPurchaseOrder(BizPurchaseOrder bizPurchaseOrder);

    /**
     * 删除采购订单
     * 
     * @param orderId 采购订单主键
     * @return 结果
     */
    public int deleteBizPurchaseOrderByOrderId(Long orderId);

    /**
     * 批量删除采购订单
     * 
     * @param orderIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteBizPurchaseOrderByOrderIds(Long[] orderIds);

    /**
     * 批量删除采购订单明细
     * 
     * @param orderIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteBizPurchaseOrderItemByOrderNos(Long[] orderIds);
    
    /**
     * 批量新增采购订单明细
     * 
     * @param bizPurchaseOrderItemList 采购订单明细列表
     * @return 结果
     */
    public int batchBizPurchaseOrderItem(List<BizPurchaseOrderItem> bizPurchaseOrderItemList);
    

    /**
     * 通过订单编号删除采购订单明细信息
     * 
     * @param orderNo 订单编号
     * @return 结果
     */
    public int deleteBizPurchaseOrderItemByOrderNo(String orderNo);

    // 新增：按 itemId 查询采购订单明细
    public BizPurchaseOrderItem selectBizPurchaseOrderItemByItemId(Long itemId);

    // 新增：更新指定明细的已打码/未打码数量与审计字段
    public int updateBizPurchaseOrderItemQuantities(
        @Param("itemId") Long itemId,
        @Param("barcodedQuantity") java.math.BigDecimal barcodedQuantity,
        @Param("unbarcodedQuantity") java.math.BigDecimal unbarcodedQuantity,
        @Param("updatedBy") String updatedBy,
        @Param("updatedTime") java.util.Date updatedTime
    );

    // 新增：更新采购订单明细状态（例如 PART_RECEIVED / FULL_RECEIVED）
    public int updateBizPurchaseOrderItemStatus(
        @Param("itemId") Long itemId,
        @Param("itemStatus") String itemStatus,
        @Param("updatedBy") String updatedBy,
        @Param("updatedTime") java.util.Date updatedTime
    );

    // 新增：更新采购订单明细的已入库数量（直接写入新值）
    public int updateBizPurchaseOrderItemPutawayQuantity(
        @Param("itemId") Long itemId,
        @Param("putawayQuantity") java.math.BigDecimal putawayQuantity,
        @Param("updatedBy") String updatedBy,
        @Param("updatedTime") java.util.Date updatedTime
    );

    // 汇总主表：根据明细求和 total_putaway；当 total_quantity == 汇总值 时置主表状态为 COMPLETED
    public int updateBizPurchaseOrderHeaderPutawayAndStatus(
        @Param("orderId") Long orderId,
        @Param("updatedBy") String updatedBy,
        @Param("updatedTime") java.util.Date updatedTime
    );

    // 新增：回滚主表的已打码/未打码汇总，并将主表状态置为 PENDING
    public int updateBizPurchaseOrderHeaderBarcodedAndStatus(
        @Param("orderId") Long orderId,
        @Param("updatedBy") String updatedBy,
        @Param("updatedTime") java.util.Date updatedTime
    );

    /**
     * 获取指定日期前缀的最大订单编号（如 PO20241215xxx）
     * @param prefix 日期前缀
     * @return 最大订单编号
     */
    public String selectMaxOrderNoByDate(String prefix);
    public java.util.List<com.ruoyi.system.domain.BizPurchaseOrderItemView> selectBizPurchaseOrderItemJoinedList(com.ruoyi.system.domain.BizPurchaseOrderItemView view);
}
